package com.ww.java8.fp.stream.onjava8.ch14;

import java.util.Arrays;
import java.util.function.Function;
import java.util.stream.Stream;

/**
 * 应用函数到元素
 * map(Function)：将函数操作应用在输入流的元素中，并将返回值传递到输出流中；
 * mapToInt(ToIntFunction)：操作同上，但结果是IntStream；
 * mapToLong(ToLongFunction)：操作同上，但结果是LongStream；
 * mapToDouble(ToDoubleFunction)：操作同上，但结果是DoubleStream；
 */
public class MapDemo01 {

    static String[] elements = { "1", "100", "1000", "10000" };

    static Stream<String> testStream() {
        return Arrays.stream(elements);
    }

    static void test(String descr, Function<String, String> func) {
        System.out.println("---(" + descr + ")---");
        testStream()
                .map(func)
                .forEach(System.out::println);
    }

    /**
     * 如果使用Function返回的结果是数值类型的一种，我们必须使用合适的mapTo数值类型进行替代。
     */
    static void testNum() {
        Stream.of("5", "6", "8")
                .mapToInt(Integer::parseInt)
                .forEach(n -> System.out.format("%d ", n));
        System.out.println();

        Stream.of("19", "21", "23")
                .mapToLong(Long::parseLong)
                .forEach(n -> System.out.format("%d ", n));
        System.out.println();

        Stream.of("18", "1.9", ".25")
                .mapToDouble(Double::parseDouble)
                .forEach(n -> System.out.format("%f ", n));
    }

    public static void main(String[] args) {
        test("add brackets", s -> "[" + s + "]");
        System.out.println("================================================================");
        test("Increment", s -> {
            try {
                return Integer.parseInt(s) + 1 + "";
            } catch (NumberFormatException e) {
                return s;
            }
        });
        test("Replace", s -> s.replace("0", "9"));
        System.out.println("================================================================");
        test("Take last digit", s -> s.length() > 0 ? s.charAt(s.length() - 1) + "" : s);
        System.out.println("****************************************************************");
        testNum();
    }
}
